const PB = require("protobufjs");
/** 
 * file： protobuf 文件proto
 * means：  protobuf 方法proto
 * data： 数据对象
 * buffer： 二进制对象
*/
const parseData = (ctx) => {
    return new Promise((resolve, reject) => {
        try {
            let str = ''
            ctx.req.addListener('data', (data) => {
                str += data
            })
            ctx.req.addListener('end', () => {
                resolve(str)
            })
        } catch (err) {
            reject(err)
        }
    })
}
// 编译protobuf 数据
const compileResponseMessage = async(file, means, data) => {
    // 载入本地proto文件
    let root = await PB.loadSync(file);
    // 获取对应的协议
    let protoResponse = await root.lookupType(means);
    // 密码正确
    let object = await protoResponse.create(data);
    let encode =  await protoResponse.encode(object).finish();
    encode = await encode.slice(0, encode.length);
    return encode;
}
// 解析protobuf 数据
const analysisRequestMessage = async(file, means, buffer) => {
    // 获取前端发来的buffer数据
    let bufferData = await parseData(buffer);
    // 载入本地proto文件
    let root = await PB.loadSync(file);
    // 获取对应的协议
    let protoRequest = await root.lookupType(means);
    // 转buffer编码
    let protoCoding = new Buffer.from(bufferData);
    // 解密
    let messageRequest = await protoRequest.decode(protoCoding);
    return messageRequest;
}

module.exports = {
    compileResponseMessage,
    analysisRequestMessage
}